package com.leetcode.stackandqueue.demo2;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @Author : Zan
 * @Create : 2024/5/18 10:38
 * @ClassName : Test
 * @Description : https://leetcode.cn/problems/implement-stack-using-queues/description/  用队列实现栈
 */
public class Test {
    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        myStack.push(1);
        myStack.push(2);
        System.out.println(myStack.top()); // 返回 2
        System.out.println(myStack.pop()); // 返回 2
        System.out.println(myStack.empty()); // 返回 False
    }
}
// boolean add(E e): 向队列添加一个元素。如果不能添加，会抛出IllegalStateException。
// boolean offer(E e): 添加一个元素到队列，如果成功返回true，否则返回false。
// E remove(): 移除并返回队列头部的元素。如果不能移除，会抛出NoSuchElementException。
// E poll(): 移除并返回队列头部的元素，如果没有元素则返回null。
// E element(): 返回队列头部的元素但不移除它。如果不能获取，会抛出NoSuchElementException。
// E peek(): 返回队列头部的元素但不移除它，如果没有元素则返回null。
class MyStack {

    Queue<Integer> queue1, queue2;

    public MyStack() {
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }

    // 给queue2添加元素
    // 如果queue1有值，将queue1的值添加到queue2的后面
    // 将queue1和queue2替换
    public void push(int x) {
        queue2.offer(x);
        while (!queue1.isEmpty()) {
            queue2.offer(queue1.poll());
        }
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }

    public int pop() {
        return queue1.poll();
    }

    public int top() {
        return queue1.peek();
    }

    public boolean empty() {
        return queue1.isEmpty();
    }
}